package com.zlk.algorithm.huawei.leetcode.stack;
import org.junit.Test;

import java.util.Stack;
/**
 * @program: algorithm
 * @ClassName Coed39_decodeString
 * @description: 字符串解码
 * 给定一个经过编码的字符串，返回它解码后的字符串。
 * 编码规则为: k[encoded_string]，表示其中方括号内部的 encoded_string
 * 正好重复 k 次。注意 k 保证为正整数。
 * 你可以认为输入字符串总是有效的；输入字符串中没有额外的空格，且输入的方括号总是符合格式要求的。
 * 此外，你可以认为原始数据不包含数字，所有的数字只表示重复的次数 k ，例如不会出现像 3a 或 2[4] 的输入。
 *
 * 示例 1：
 *
 * 输入：s = "3[a]2[bc]"
 * 输出："aaabcbc"
 * 示例 2：
 *
 * 输入：s = "3[a2[c]]"
 * 输出："accaccacc"
 * 示例 3：
 *
 * 输入：s = "2[abc]3[cd]ef"
 * 输出："abcabccdcdcdef"
 * 示例 4：
 *
 * 输入：s = "abc3[cd]xyz"
 * 输出："abccdcdcdxyz"
 * @author: slfang
 * @create: 2025-01-13 14:36
 * @Version 1.0
 **/
public class Code39_decodeString {

    //"3[a2[c]]"
    //"3[a]2[bc]"
    public String decodeString(String s) {
        Stack<String> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //当卡字符是数组
            if(Character.isDigit(c)){
                int tempi = i+1;
                while (Character.isDigit(s.charAt(tempi))){
                    tempi++;
                }
                stack.add(s.substring(i,tempi));
                i=tempi-1;
            }else if(c==']'){
                String str = "";
                while (!stack.isEmpty()){
                    String pop = stack.pop();
                    if("[".equals(pop)){
                       break;
                    }else{
                        str = pop+str;
                    }
                }
                int num = Integer.valueOf(stack.pop());
                StringBuilder newInnerStr =new StringBuilder();
                for (int j = 0; j < num; j++) {
                    newInnerStr.append(str);
                }
                stack.add(newInnerStr.toString());
            }else{
                stack.add(""+c);
            }
        }
        String ans = "";
        while (!stack.isEmpty()){
            String pop = stack.pop();
            ans=pop+ans;
        }
        return ans;
    }

    @Test
    public void test(){
        System.out.println(decodeString("3[a]2[bc]"));
    }
}
